分層架構是一個架構設計常見的模式,並且非常適合運用在小型的單體上。他有許多優點,例如:
當我們談到分層架構,常有一個迷思,為了更容易取代外部依賴,因此我們應該將所有依賴變成一個分層。例如更容易把MySQL換成MongoDB,所以把所有資料庫存取都封裝起來。
事實上,這不是分層架構的目的。我相信我們鮮少需要換掉資料庫、web框架甚至程式語言吧?那麼,到底分層的好處是什麼?
在我們深入討論前,我們先來看一個分層的例子。
上面的圖是一個典型web服務的分層架構。
我們將一個請求的流程分成四個元件,路由層、控制層、服務層和倉儲層。每一個元件都有他的職責,必須處理整個請求流程的部分工作,這樣的精神也稱為單一職責原則(Single-Responsibility Principle)。
在很多文章或書籍中都教導我們,路由層是為了更容易抽換web框架,而倉儲層是為了抽換資料庫。但是,就像我剛說的,我們很少需要換掉那些根深蒂固的元件,這裡的路由層和倉儲層只是為了完成他們的使命。
既然每個層都有自己的使命,那麼我來介紹一下他們各自的功能吧。
上面的文字有點抽象,因此我提供一個比較具體的例子:https://github.com/wirelessr/Clean-Architect-in-Golang
這份程式碼拜「尖叫架構」之賜很淺顯易懂,因此我們可以了解一下典型的分層是架構長什麼樣子。
註:尖叫架構指的是光看目錄結構就能知道系統的目的,就像系統在尖叫而得名。
mux
這個HTTP框架的封裝。他沒做什麼事,僅僅只有將對應的HTTP請求路由到控制層。firestore
。我們只是為了滿足單一職責原則而把一個架構拆成這麼多層嗎?不只是這樣。
這樣的架構有許多好處,讓我解釋一下兩個最重要的優點。
第二個優點很直覺,因此我將重點擺在第一點。
在昨天我們提過,我們可以藉由依賴注入來大幅提高測試的覆蓋率。舉例來說,在我的程式碼範例中,我們可以輕易地建立一個假的資料庫用來控制測試流程。如此一來,就不需要一個真的資料庫並且準備測試資料。
有許多文章都在比較分層架構和微服務架構,但是分層架構並不只是一種架構上的設計模式,更是一種設計原則,用來達成更SOLID的軟體結構。
這篇文章試著用一個實際的例子將分層架構套進微服務架構中,事實證明,分層架構和微服務架構並不是兩個獨立互斥的概念。更重要的是,他們可以彼此互補。
這篇 談分層架構超有感,
尤其我鐵人賽寫資安治理,
組織要分層,要有各自的權責,
程式撰寫架構要分層,便於測試驅動開發,容易找出問題....
但是我發現滿多企業不喜歡讓人找出問題,喜歡吃飯大鍋飯,都沒有問題,有問題的一定是提出問題的人....
如果是這樣的話,建議換個工作。
工程師必須對事不對人,如果一直在解決政治問題,那無論組織還是技術都不會進步的。
好險我只是外部顧問,我的角度是政治水很深,不容易由下去推動,往往成為底下人的刀子,磨刀霍霍向工程師的長官
在我們這邊,這是architect的工作,對上對下的緩衝。
政治往往在上面就解決了,工程師專心做事就好。